package com.cn.wanxi.service.impl;


import com.cn.wanxi.dao.CompanyDao;
import com.cn.wanxi.model.CompanyModel;
import com.cn.wanxi.service.CompanyService;
import com.cn.wanxi.util.IOTool;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 当一个方法里面的代码量比较大，而且他们之间的关系没有多大影响，或者相互独立，
 * 则我们需要将每一个功能代码进行分开，即单独写一个方法进行调用
 */
public class CompanyServiceImpl implements CompanyService {
    private static final String PATH = "E:\\wanxi\\step-3\\canyin03-1129\\web";
    private static final String DIRECTORY = "note";
    private static final String FILE_NAME = "company.txt";
    private static final String SPLIT = "\n";
//    JAVA的换行符?
//    \t空白字符
//    \r ,\n
//    private File file;

    @Override
    public CompanyModel getCompanyModel() {
//        1.创建文件
        File file = IOTool.createFile(FILE_NAME);
//        2.保存数据
//        如果写出来的是乱码，则应该再写的时候设置编码格式
        String[] data = CompanyDao.data;
        IOTool.saveData(file, data);
//        3.读取数据
        String result = IOTool.readData(file);
//        4.封装数据
        return setData(result);
    }

    private CompanyModel setData(String result) {
//        System.out.println(result);
//        结果是一个比较长的字符串，我们可以通过分隔符来得到相应的数据
//        所以，我们需要将result 分割成字符然后分别赋值给companyModel
//        通过分隔符分割出相同的元素，需要用一个大的容器来接收：数组
        String[] results = result.split(SPLIT);
        for (int i = 0; i < results.length; i++) {
            System.out.println(results[i] + "----------" + i);
        }
        CompanyModel companyModel = new CompanyModel();
        companyModel.setLogo(results[0]);
        companyModel.setPhone(results[1]);
        companyModel.setNet(results[2]);
        companyModel.setEmail(results[3]);
        companyModel.setLinePhone(results[4]);
        companyModel.setAddress(results[5]);
        companyModel.setVersion(results[6]);
        return companyModel;
    }

//    private String readData(File file) {
//        try {
//            InputStream inputStream = new FileInputStream(file);
////            因为我们读取的文件不知道有多大，每次读取都是返回一个字节
////            所以，我们应该用循环遍历出所有数据
////            而且返回的是字节数，所以需要将字节转换为字符
////            int read = 0;
////            for (int i = 0; i <file.length() ; i++) {
////                if(read!=-1){
////                    read=inputStream.read();
////                    char aa= (char) read;
////                    System.out.print(aa);
//////                    当读取的是中文的时候，会出现乱码
//////  中文字符的字节是多少？中文有多少个字节;
//////                    所以，我们不应该每次读取一个字节，可以每次读取一个字符
////
////                }
////            }
////            int read = 0;
////            while ((read = inputStream.read()) != -1) {
////                System.out.print((char) read);
////            }
////            我们需要拿到读取的数据
////            Reader reader = new FileReader(file);
//            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
//            Reader reader = new BufferedReader(inputStreamReader);
//            int read = 0;
////            char c = '2';
////            char d = '1';
////            String e = c + String.valueOf(d);
////            String ff = "1" + 1;
////           String e= String.valueOf(c+d);//整型转换为字符串
//            StringBuilder result = new StringBuilder();
////            String 和StringBuilder 和StringBuffer的区别？
////            String 会创建一百个对象，二其他不会创建新对象，而是自动扩展空间
//            while ((read = reader.read()) != -1) {
////                String aa=String.valueOf((char) read).getBytes("utf-8").toString();
////                result.append(aa);
//                result.append((char) read);
//            }
////            System.out.print(result);
//            return result.toString();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return "";
//    }
//
//    /**
//     * 保存数据
//     * 保存到哪里？文件
//     * 所以，需要文件这个对象
//     * 抽象类和接口？
//     */
//    private void saveData(File file) {
//        try {
////            如果需要保存数据，则是将内存里面的数据保存到文件，则是输出流
//            OutputStream outputStream = new FileOutputStream(file);
//
////            将字符串转换为整型或者byte数组
////            Integer.parseInt(logo)证明如果需要转换为数字必须是数组，不能为字符或者为null
////  如果按照所有的数据直接写入记事本，则再读取数据封装时，不好识别数据
////            所以需要对数据进行隔离
//            int length = CompanyDao.data.length;
//            for (int i = 0; i < length; i++) {
//                outputStream.write(CompanyDao.data[i].getBytes(StandardCharsets.UTF_8));
//                outputStream.write(SPLIT.getBytes(StandardCharsets.UTF_8));
//            }
//
//
////            outputStream.write(CompanyDao.PHONE.getBytes());
////            outputStream.write(SPLIT.getBytes());
////            outputStream.write(CompanyDao.NET.getBytes());
////            outputStream.write(SPLIT.getBytes());
////            outputStream.write(CompanyDao.EMAIL.getBytes());
////            outputStream.write(SPLIT.getBytes());
////            outputStream.write(CompanyDao.LINE_PHONE.getBytes());
////            outputStream.write(SPLIT.getBytes());
////            outputStream.write(CompanyDao.ADDRESS.getBytes());
////            outputStream.write(SPLIT.getBytes());
////            outputStream.write(CompanyDao.VERSION.getBytes());
////            outputStream.write(SPLIT.getBytes());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }

    /**
     * 每一个方法必须写注释
     * 1.命名规则  小驼峰
     * 2.见名知意   见到名字知道意思
     * 3.只能是英文，不允许出现数字，下划线特殊字符，不允许出现缩写
     * -------------------------------
     * findByUsernameAndPassword(); 不允许出现缩写（强制性）fbuap
     * 以后我们不要再我们的方法代码里面出现常量：不可改变的变量
     */
//    private File createFile() {
////        io流的分类？
////        System.out.println();
////        创建文件？需要什么条件？
////        1.需要路径（目录）
////        2.需要文件名
////        Java  得到对象的方式？4种
////        方法名和类名一样？构造方法
////        构造方法主要目的：得到当前对象
////        构造方法是否有返回值？返回值是它本身
//
//        File pathDirectory = new File(PATH, DIRECTORY);
//
//        System.out.println(pathDirectory);
////        一般情况下，创建文件夹之前，需要判断当前文件夹是否存在，
////        只有不存在时，才做创建
//        boolean isDirectory = pathDirectory.isDirectory();
////        if (!isDirectory) {
//        boolean mkdir = pathDirectory.mkdirs();
//        System.out.println(mkdir);
////        如果已经存在文件夹，下次再创建时，时删除以前的文件夹重新创建还是不创建？
//
//        File file = new File(pathDirectory, FILE_NAME);
////        这里出现异常  exception？
////        运行时异常和编译时异常的区别？
//        try {
//            boolean newFile = file.createNewFile();
//            System.out.println(newFile);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return file;
////        }
////        boolean directory = file.isHidden();
////        System.out.println(directory);
//
//    }

//    public static void main(String[] args) {
//
//        new CompanyServiceImpl().getCompanyModel();
////        String aa="中文";
////        英文字符和数字属于一个字节
////        try {
////            System.out.println(aa.getBytes("utf-8").length);
////        } catch (UnsupportedEncodingException e) {
////            e.printStackTrace();
////        }
//    }
}
